# WriteExecutor.java

    package org.codefilarete.stalactite.engine.runtime;

    import org.codefilarete.tool.collection.SteppingIterator;
    import org.codefilarete.stalactite.mapping.EntityMapping;
    import org.codefilarete.stalactite.sql.ConnectionConfiguration;
    import org.codefilarete.stalactite.sql.statement.DMLGenerator;
    import org.codefilarete.stalactite.sql.statement.WriteOperationFactory;
    import org.codefilarete.stalactite.sql.ddl.structure.Table;
    import org.codefilarete.stalactite.sql.statement.WriteOperation;

    /**
     * Parent class for insert, update or delete executor
     *
     * @author Guillaume Mary
     */
    public abstract class WriteExecutor<C, I, T extends Table<T>> extends DMLExecutor<C, I, T> {

    	private final int batchSize;
    	private final WriteOperationFactory writeOperationFactory;

    	public WriteExecutor(EntityMapping<C, I, T> mappingStrategy,
    						 ConnectionConfiguration connectionConfiguration,
    						 DMLGenerator dmlGenerator,
    						 WriteOperationFactory writeOperationFactory,
    						 int inOperatorMaxSize) {
    		super(mappingStrategy, connectionConfiguration.getConnectionProvider(), dmlGenerator, inOperatorMaxSize);
    		this.batchSize = connectionConfiguration.getBatchSize();
    		this.writeOperationFactory = writeOperationFactory;
    	}

    	public int getBatchSize() {
    		return batchSize;
    	}

    	public WriteOperationFactory getWriteOperationFactory() {
    		return writeOperationFactory;
    	}

    	/**
    	 * Iterator that triggers batch execution every batch size step.
    	 * Useful for insert and delete statements.
    	 */
    	public static class JDBCBatchingIterator<E> extends SteppingIterator<E> {
    		private final WriteOperation writeOperation;

    		public JDBCBatchingIterator(Iterable<? extends E> entities, WriteOperation writeOperation, int batchSize) {
    			super(entities, batchSize);
    			this.writeOperation = writeOperation;
    		}

    		@Override
    		protected void onStep() {
    			writeOperation.executeBatch();
    		}

    		public WriteOperation getWriteOperation() {
    			return writeOperation;
    		}
    	}
    }